/* 
 * File:   Rationnal.h
 * Author: Gab'z
 *
 * Created on 29 mai 2012, 12:26
 */

#ifndef RATIONNAL_H
#define	RATIONNAL_H

#include "SimpleNumber.h"

namespace calculator {
    class Integer;

    class Rationnal : public SimpleNumber {
        friend class Real;

    public:
        Rationnal(int n, int d = 1);
        Rationnal(const Integer& e);
        Rationnal(const Rationnal& orig);
        virtual ~Rationnal();
        Rationnal* clone() const;

        std::string toString() const;
        double value() const;
        Rationnal& operator=(const Rationnal& r);
        Rationnal& operator+=(const Rationnal& r);
        Rationnal& operator-=(const Rationnal& r);
        Rationnal& operator*=(const Rationnal& r);
        Rationnal& operator/=(const Rationnal& r);
        Rationnal& pow(const Integer& e);

    private:
        int _num;
        int _denom;

        int pgcd(int a, int b) const;
        void simplifier();
    };
    Rationnal operator+(const Rationnal& r1, const Rationnal& r2);
    Rationnal operator-(const Rationnal& r1, const Rationnal& r2);
    Rationnal operator*(const Rationnal& r1, const Rationnal& r2);
    Rationnal operator/(const Rationnal& r1, const Rationnal& r2);
    Rationnal pow(const Rationnal& r1, const Integer& e);

}

#endif	/* RATIONNAL_H */

